package cn.green.core.components.dialect;

import cn.green.core.components.entity.DatabaseSql;
import cn.green.core.components.entity.JoinInfo;
import cn.green.core.model.QCondition;
import com.alibaba.fastjson.JSONObject;
import cn.green.core.model.QTable;

import java.util.List;
import java.util.Map;

/**
 * 数据库查询方言
 */
public interface DatabaseDqlDialect {

    /**
     * 建造查询sql
     * @param primaryTable  主表
     * @param joinInfos     连接信息
     * @param param         查询参数
     * @return
     */
    DatabaseSql selectListSql(QTable primaryTable,
                              Map<String, JoinInfo> joinInfos,
                              Map<String, JoinInfo> notJoinInfos,
                              JSONObject param);

    /**
     * 建造查询sql
     * @param primaryTable
     * @param conditions
     * @return
     */
    DatabaseSql selectListSql(QTable primaryTable, List<QCondition> conditions);
    /**
     * @deprecated 废弃原因：在有跨库的表连接的时候，如果直接分页，则数据不准确，因此，建议使用先查询所有数据，再分页
     * @param table         表名
     * @param param         查询参数
     * @param pageNo        页码
     * @param pageSize      尺寸
     * @return              数据sql
     */
    @Deprecated
    DatabaseSql selectPageSql(QTable table, JSONObject param, Integer pageNo, Integer pageSize);

    /**
     * @deprecated 废弃原因：在有跨库的表连接的时候，如果直接分页，则数据不准确，因此，建议使用先查询所有数据,直接得到数据总数
     * @param table         表名
     * @param condition     查询条件
     * @param param         查询参数
     * @return              数据sql
     */
    @Deprecated
    DatabaseSql selectTotal(QTable table, JSONObject param);
    /**
     * 查出对应主键的数据明细
     */
    DatabaseSql selectOneSql(QTable primaryTable,
                             Map<String, JoinInfo> joinInfos, Object primaryValue);

    /**
     * 建造查询条件sql
     * @param table         主表
     * @param joinInfos     同库关联
     * @param notJoinInfos  跨库关联
     * @param param         参数
     * @param jdbcParams    jdbc参数
     * @return
     */
    List<String> buildConditionSql(QTable table, Map<String, JoinInfo> joinInfos, Map<String, JoinInfo> notJoinInfos,JSONObject param, List<Object> jdbcParams);

    List<String> buildConditionSql(QTable table, List<QCondition> conditions, List<Object> jdbcParams);
}
